﻿/* ************************************
*《精通Windows API》 
* 示例代码
* osinfo.c
* 10.1  系统信息
**************************************/
/* Windows 2k */
#define _WIN32_WINNT  0x0500
/* 头文件 */
#include <windows.h>
#include <Lmcons.h>
#include <stdio.h>
/* 函数声明 */
void ShowVersionInfo();
void ShowSystemInfo();
void GetFolders();
void GetNames();
void MouseSpeed();
/* ************************************
* int main()
* 功能	依次调用各示例函数
**************************************/
int main()
{
	ShowVersionInfo();
	ShowSystemInfo();
	GetFolders();
	GetNames();
	MouseSpeed();
	system("pause");
}

/* ************************************
* void ShowVersionInfo()
* 功能	获取并显示系统版本信息
**************************************/
void ShowVersionInfo()
{
	OSVERSIONINFOEX ovex; //OSVERSIONINFOEX  winnt.h 中声明的包含系统信息的结构体
	CHAR szVersionInfo[1024];
	*szVersionInfo = '\x00';
	// 设置参数大小，调用并判断是否成功
	ovex.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
	if(!GetVersionEx(&ovex))  //获取系统信息
	{
		printf("error %d\n",GetLastError());
		return;
	}
	// 判断版本
	if(ovex.dwMajorVersion==5)
	{
		if(ovex.dwMinorVersion==0)
			lstrcat(szVersionInfo,"Windows 2000 "); //将"Windows 2000 "添加到字符串szVersionInfo后面
		else if(ovex.dwMinorVersion==1)
			lstrcat(szVersionInfo,"Windows XP ");
		else if(ovex.dwMinorVersion==2)
			lstrcat(szVersionInfo,"Windows Server 2003 ");
	}
	else if(ovex.dwMajorVersion == 6)
		lstrcat(szVersionInfo,"Windows Vista ");
	else
		lstrcat(szVersionInfo,"Windows NT 4.0 或者其他 ");
	printf("测试");
	printf("\n");
	printf(szVersionInfo);
	printf("改");
	printf(ovex.szCSDVersion);
	// 安装的SP，字符串
	lstrcat(szVersionInfo,ovex.szCSDVersion);
	printf("\n");
	printf(szVersionInfo);
	// 判断wProductType，产品类型
	switch(ovex.wProductType)
	{
	case VER_NT_DOMAIN_CONTROLLER:
		lstrcat(szVersionInfo,"\n域控制器");
		break;
	case VER_NT_SERVER:
		lstrcat(szVersionInfo,"\n服务器");
		break;
	case VER_NT_WORKSTATION :
		lstrcat(szVersionInfo,"\n独立工作站");
		break;
	}
	// 判断wSuiteMask
	if(ovex.wSuiteMask & VER_SUITE_PERSONAL)
	{
		lstrcat(szVersionInfo,"\nWindows XP Home Edition");
	}
	if(ovex.wSuiteMask & VER_SUITE_SINGLEUSERTS)
	{
		lstrcat(szVersionInfo,"\n安装了终端服务，但只支持一个会话");
	}
	// wSuiteMask成员还可能是以下值的组合
	//VER_SUITE_BLADE
	//VER_SUITE_COMPUTE_SERVER
	//VER_SUITE_DATACENTER
	//VER_SUITE_ENTERPRISE
	//VER_SUITE_EMBEDDEDNT
	//VER_SUITE_PERSONAL
	//VER_SUITE_SINGLEUSERTS
	//VER_SUITE_SMALLBUSINESS
	//VER_SUITE_SMALLBUSINESS_RESTRICTED
	//VER_SUITE_STORAGE_SERVER
	//VER_SUITE_TERMINAL
	printf("%s\n",szVersionInfo);
}
/* ************************************
* void ShowSystemInfo()
* 功能	获取并显示硬件相关信息
**************************************/
void ShowSystemInfo()
{
	SYSTEM_INFO si;
	GetSystemInfo(&si); //获取用户系统信息
	printf("内存分页大小:0x%.8X，可用内存起始:0x%.8X，可用内存结束:0x%.8X，\n"
		"处理器个数:%d，处理器类型:",
		si.dwPageSize,
		si.lpMinimumApplicationAddress,
		si.lpMaximumApplicationAddress,
		si.dwNumberOfProcessors);

	switch (si.dwProcessorType)
	{
	case PROCESSOR_INTEL_386:
		printf("386");
		break;
	case PROCESSOR_INTEL_486:
		printf("486");
		break;
	case PROCESSOR_INTEL_PENTIUM:
		printf("pentium");
		printf(", Cpu Model 0x%.2X, Stepping 0x%.2X",
			(BYTE)(si.wProcessorRevision>>8),
			(BYTE)si.wProcessorRevision);
		break;
	}
	printf("\n处理器架构:");
	switch (si.wProcessorArchitecture)
	{
	case PROCESSOR_ARCHITECTURE_INTEL:
		printf("intel");
		printf(" CPU vendor is %d",si.wProcessorLevel);
		break;
	case PROCESSOR_ARCHITECTURE_IA64:
		printf("64 bits intel");
		break;
	case PROCESSOR_ARCHITECTURE_AMD64:
		printf("64 bits AMD");
		break;
	case PROCESSOR_ARCHITECTURE_UNKNOWN:
		printf("UNKNOWN");
		break;
	}
	printf("\n");
}
/* ************************************
*void GetFolders()
* 功能	获取系统目录等信息
**************************************/
void GetFolders()
{
	TCHAR szSystemDirectory[MAX_PATH];
	TCHAR szWindowsDirectory[MAX_PATH];

	GetSystemDirectory(szSystemDirectory,MAX_PATH);  //sysinfoapi.h中的方法
	GetWindowsDirectory(szWindowsDirectory,MAX_PATH);
	printf("系统目录：\t%s\nWindows目录：\t%s\n",
		szSystemDirectory,
		szWindowsDirectory);
}
/* ************************************
* void GetNames()
* 功能	获取计算机名、用户名等信息
**************************************/
void GetNames()
{
	DWORD dwComputerNameLen = MAX_COMPUTERNAME_LENGTH+1;
	DWORD dwUserNameLen = UNLEN+1;
	TCHAR szComputerName[MAX_COMPUTERNAME_LENGTH+1];
	TCHAR szUserName[UNLEN + 1];
	if(!SetComputerName("My_Computer"))
	{
		printf("Set Error %d",GetLastError());
	}
	GetComputerName(szComputerName,&dwComputerNameLen);

	printf("计算机名：%s\n",szComputerName);

	//ComputerNameNetBIOS 
	//ComputerNameDnsHostname 
	//ComputerNameDnsFullyQualified 
	//ComputerNamePhysicalNetBIOS 
	//ComputerNamePhysicalDnsHostname 
	//ComputerNamePhysicalDnsDomain 
	//ComputerNamePhysicalDnsFullyQualified 
	dwComputerNameLen = MAX_COMPUTERNAME_LENGTH+1;
	GetComputerNameEx(ComputerNameDnsHostname,szComputerName,&dwComputerNameLen);
	printf("ComputerNameDnsHostname: %s\n",szComputerName);

	dwComputerNameLen = MAX_COMPUTERNAME_LENGTH+1;
	GetComputerNameEx(ComputerNamePhysicalNetBIOS,szComputerName,&dwComputerNameLen);
	printf("ComputerNamePhysicalNetBIOS: %s\n",szComputerName);	
	GetUserName(szUserName,&dwUserNameLen);
	printf("用户名：%s\n",szUserName);
}
/* ************************************
* void MouseSpeed()
* 功能	获取系统目录等信息
**************************************/
void MouseSpeed()
{

	BOOL fResult;
	int aMouseInfo[3];       // 保存数据信息的数组

	// 调用 SystemParametersInfo
	fResult = SystemParametersInfo( //WinUser.h中的方法
		SPI_GETMOUSE,   // 获取鼠标信息
		0,              // 未使用
		&aMouseInfo,    // 用于保存鼠标信息
		0);             // 未使用

	// 把鼠标速度加倍 
	if( fResult )
	{
		aMouseInfo[2] = 2 * aMouseInfo[2]; 

		SystemParametersInfo(
			SPI_SETMOUSE,		// 设置鼠标信息
			0,                 // 未使用
			aMouseInfo,			// 鼠标信息
			SPIF_SENDCHANGE);  // 更新 win.ini 
	}
}